๋ง์ถคํ ์ธ์ ๋ฐฑ์๋๋ฅผ ๊ตฌ์ถํ์ฌ Django ์ธ์ ํ๋ ์์ํฌ์ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ์ ์ดํด๋ณด์ธ์. ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ณ ์ ํ ์๊ตฌ์ฌํญ์ ๋ง์ถฐ ์ธ์ ์คํ ๋ฆฌ์ง๋ฅผ ์กฐ์ ํ๊ณ ์ฑ๋ฅ ๋ฐ ํ์ฅ์ฑ์ ํฅ์์ํค๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์ฐ์ธ์.
Django ์ดํดํ๊ธฐ: ํ์ฅ ๊ฐ๋ฅํ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํ ๋ง์ถคํ ์ธ์ ๋ฐฑ์๋ ์ ์
Django์ ์ธ์ ํ๋ ์์ํฌ๋ ์์ฒญ ์ ๋ฐ์ ๊ฑธ์ณ ์ฌ์ฉ์๋ณ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ๊ฐ๋ ฅํ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก Django๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค, ์บ์, ํ์ผ ๊ธฐ๋ฐ ์คํ ๋ฆฌ์ง๋ฅผ ํฌํจํ ์ฌ๋ฌ ๋ด์ฅ ์ธ์ ๋ฐฑ์๋๋ฅผ ์ ๊ณตํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ธ์ ๊ด๋ฆฌ์ ๋ํ ์ธ๋ฐํ ์ ์ด๊ฐ ํ์ํ ๊น๋ค๋ก์ด ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฒฝ์ฐ, ๋ง์ถคํ ์ธ์ ๋ฐฑ์๋๋ฅผ ์ ์ํ๋ ๊ฒ์ด ํ์์ ์ ๋๋ค. ์ด ํฌ๊ด์ ์ธ ๊ฐ์ด๋๋ Django ์ธ์ ํ๋ ์์ํฌ์ ๋ณต์ก์ฑ์ ํ๊ตฌํ๊ณ , ํน์ ์๊ตฌ์ฌํญ์ ๋ง์ถฐ ๋ง์ถคํ ๋ฐฑ์๋๋ฅผ ๊ตฌ์ถํ ์ ์๋๋ก ์ง์ํฉ๋๋ค.
Django ์ธ์ ํ๋ ์์ํฌ ์ดํดํ๊ธฐ
Django ์ธ์ ํ๋ ์์ํฌ์ ํต์ฌ์ ๊ฐ ์ฌ์ฉ์์๊ฒ ๊ณ ์ ํ ์ธ์ ID๋ฅผ ํ ๋นํ๋ ๋ฐฉ์์ผ๋ก ์๋ํฉ๋๋ค. ์ด ID๋ ์ผ๋ฐ์ ์ผ๋ก ๋ธ๋ผ์ฐ์ ์ฟ ํค์ ์ ์ฅ๋๋ฉฐ ์๋ฒ ์ธก ์คํ ๋ฆฌ์ง์์ ์ธ์ ๋ฐ์ดํฐ๋ฅผ ๊ฒ์ํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ์ด ํ๋ ์์ํฌ๋ ๋ทฐ ๋ด์์ ์ธ์ ๋ฐ์ดํฐ์ ์ก์ธ์คํ๊ณ ์์ ํ๊ธฐ ์ํ ๊ฐ๋จํ API๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ด ๋ฐ์ดํฐ๋ ๋์ผํ ์ฌ์ฉ์๋ก๋ถํฐ์ ์ฌ๋ฌ ์์ฒญ์ ๊ฑธ์ณ ์ ์ง๋์ด ์ฌ์ฉ์ ์ธ์ฆ, ์ฅ๋ฐ๊ตฌ๋, ๊ฐ์ธํ๋ ๊ฒฝํ๊ณผ ๊ฐ์ ๊ธฐ๋ฅ์ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค.
๋ด์ฅ ์ธ์ ๋ฐฑ์๋: ๊ฐ๋ตํ ๊ฐ์
Django๋ ๊ฐ๊ฐ ๊ณ ์ ํ ์ฅ๋จ์ ์ ๊ฐ์ง ์ฌ๋ฌ ๋ด์ฅ ์ธ์ ๋ฐฑ์๋๋ฅผ ์ ๊ณตํฉ๋๋ค:
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ธ์
๋ฐฑ์๋ (
django.contrib.sessions.backends.db
): ์ธ์ ๋ฐ์ดํฐ๋ฅผ Django ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅํฉ๋๋ค. ์์ ์ ์ธ ์ต์ ์ด์ง๋ง ํธ๋ํฝ์ด ๋ง์ ์น์ฌ์ดํธ์์๋ ์ฑ๋ฅ ๋ณ๋ชฉ ํ์์ด ๋ ์ ์์ต๋๋ค. - ์บ์ ์ธ์
๋ฐฑ์๋ (
django.contrib.sessions.backends.cache
): ์ธ์ ๋ฐ์ดํฐ ์ ์ฅ์ ์ํด ์บ์ฑ ์์คํ (์: Memcached, Redis)์ ํ์ฉํฉ๋๋ค. ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฐฑ์๋์ ๋นํด ํฅ์๋ ์ฑ๋ฅ์ ์ ๊ณตํ์ง๋ง ์บ์ฑ ์๋ฒ๊ฐ ํ์ํฉ๋๋ค. - ํ์ผ ๊ธฐ๋ฐ ์ธ์
๋ฐฑ์๋ (
django.contrib.sessions.backends.file
): ์ธ์ ๋ฐ์ดํฐ๋ฅผ ์๋ฒ ํ์ผ ์์คํ ์ ํ์ผ์ ์ ์ฅํฉ๋๋ค. ๊ฐ๋ฐ ๋๋ ์๊ท๋ชจ ๋ฐฐํฌ์ ์ ํฉํ์ง๋ง ํ์ฅ์ฑ ๋ฐ ๋ณด์ ๋ฌธ์ ๋ก ์ธํด ํ๋ก๋์ ํ๊ฒฝ์์๋ ๊ถ์ฅ๋์ง ์์ต๋๋ค. - ์บ์๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ธ์
๋ฐฑ์๋ (
django.contrib.sessions.backends.cached_db
): ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์บ์ ๋ฐฑ์๋๋ฅผ ๊ฒฐํฉํฉ๋๋ค. ์บ์์์ ์ธ์ ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ณ ์บ์์์ ๋ฐ์ดํฐ๋ฅผ ์ฐพ์ ์ ์๋ ๊ฒฝ์ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ก ํด๋ฐฑํฉ๋๋ค. ์ธ์ ๋ฐ์ดํฐ๋ฅผ ์บ์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ชจ๋์ ์๋๋ค. - ์ฟ ํค ๊ธฐ๋ฐ ์ธ์
๋ฐฑ์๋ (
django.contrib.sessions.backends.signed_cookies
): ์ธ์ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉ์ ์ฟ ํค์ ์ง์ ์ ์ฅํฉ๋๋ค. ์ด๋ ๋ฐฐํฌ๋ฅผ ๋จ์ํํ์ง๋ง ์ ์ฅํ ์ ์๋ ๋ฐ์ดํฐ์ ์์ ์ ํํ๋ฉฐ, ์ ์คํ๊ฒ ๊ตฌํํ์ง ์์ผ๋ฉด ๋ณด์ ์ํ์ ์ด๋ํ ์ ์์ต๋๋ค.
๋ง์ถคํ ์ธ์ ๋ฐฑ์๋๋ฅผ ์์ฑํ๋ ์ด์
Django์ ๋ด์ฅ ๋ฐฑ์๋๊ฐ ๋ง์ ์๋๋ฆฌ์ค์ ์ ํฉํ์ง๋ง, ๋ง์ถคํ ๋ฐฑ์๋๋ ๋ช ๊ฐ์ง ์ฅ์ ์ ์ ๊ณตํฉ๋๋ค:
- ์ฑ๋ฅ ์ต์ ํ: ํน์ ๋ฐ์ดํฐ ์ก์ธ์ค ํจํด์ ๋ง์ถฐ ์คํ ๋ฆฌ์ง ๋ฉ์ปค๋์ฆ์ ์กฐ์ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ํน์ ์ธ์ ๋ฐ์ดํฐ์ ์์ฃผ ์ก์ธ์คํ๋ ๊ฒฝ์ฐ ํด๋น ๋ฐ์ดํฐ๋ง ๊ฒ์ํ๋๋ก ๋ฐฑ์๋๋ฅผ ์ต์ ํํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ก๋ ๋๋ ์บ์ ๊ฒฝํฉ์ ์ค์ผ ์ ์์ต๋๋ค.
- ํ์ฅ์ฑ: ๋์ฉ๋ ๋ฐ์ดํฐ๋ฅผ ์ํด ์ค๊ณ๋ ํน์ ์คํ ๋ฆฌ์ง ์๋ฃจ์ ๊ณผ ํตํฉํฉ๋๋ค. ๋งค์ฐ ํฐ ์ธ์ ๋ฐ์ดํฐ์ ์ ๊ฒฝ์ฐ Cassandra ๋๋ MongoDB์ ๊ฐ์ NoSQL ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฌ์ฉ์ ๊ณ ๋ คํ์ธ์.
- ๋ณด์: ๋ฏผ๊ฐํ ์ธ์ ๋ฐ์ดํฐ๋ฅผ ๋ณดํธํ๊ธฐ ์ํด ์ํธํ ๋๋ ํ ํฐ ๊ธฐ๋ฐ ์ธ์ฆ๊ณผ ๊ฐ์ ๋ง์ถคํ ๋ณด์ ์กฐ์น๋ฅผ ๊ตฌํํฉ๋๋ค.
- ๊ธฐ์กด ์์คํ ๊ณผ์ ํตํฉ: ๋ ๊ฑฐ์ ์ธ์ฆ ์์คํ ๋๋ ํ์ฌ ๋ฐ์ดํฐ ์ ์ฅ์์ ๊ฐ์ ๊ธฐ์กด ์ธํ๋ผ์ ์ํํ๊ฒ ํตํฉํฉ๋๋ค.
- ๋ง์ถคํ ๋ฐ์ดํฐ ์ง๋ ฌํ: ํจ์จ์ ์ธ ๋ฐ์ดํฐ ์ ์ฅ ๋ฐ ์ ์ก์ ์ํด ๋ง์ถคํ ์ง๋ ฌํ ํ์ (์: Protocol Buffers, MessagePack)์ ์ฌ์ฉํฉ๋๋ค.
- ํน์ ์๊ตฌ์ฌํญ: ์ง๋ฆฌ์ ์ผ๋ก ๋ถ์ฐ๋ ๋ฐฉ์์ผ๋ก ์ธ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ์ฌ ์ฌ๋ฌ ์ง์ญ์ ์ฌ์ฉ์์๊ฒ ๋ํ ์ง์ฐ ์๊ฐ์ ์ต์ํํ๋ ๋ฑ ๊ณ ์ ํ ์ ํ๋ฆฌ์ผ์ด์ ์๊ตฌ์ฌํญ์ ํด๊ฒฐํฉ๋๋ค (์: ์ ๋ฝ ์ฌ์ฉ์์ ์ธ์ ์ ์ ๋ฝ ๋ฐ์ดํฐ ์ผํฐ์ ์ ์ฅ).
๋ง์ถคํ ์ธ์ ๋ฐฑ์๋ ๊ตฌ์ถ: ๋จ๊ณ๋ณ ๊ฐ์ด๋
๋ง์ถคํ ์ธ์
๋ฐฑ์๋๋ฅผ ์์ฑํ๋ ค๋ฉด django.contrib.sessions.backends.base.SessionBase
๋ฅผ ์์ํ๊ณ ๋ช ๊ฐ์ง ์ฃผ์ ๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ํ๋ ํด๋์ค๋ฅผ ๊ตฌํํด์ผ ํฉ๋๋ค.
1. ์ ์ธ์ ๋ฐฑ์๋ ๋ชจ๋ ์์ฑ
Django ํ๋ก์ ํธ ๋ด์ ์ Python ๋ชจ๋ (์: my_session_backend.py
)์ ์์ฑํฉ๋๋ค. ์ด ๋ชจ๋์ ๋ง์ถคํ ์ธ์
๋ฐฑ์๋์ ๊ตฌํ์ ํฌํจํ ๊ฒ์
๋๋ค.
2. ์ธ์ ํด๋์ค ์ ์
๋ชจ๋ ๋ด์์ django.contrib.sessions.backends.base.SessionBase
๋ฅผ ์์ํ๋ ํด๋์ค๋ฅผ ์ ์ํฉ๋๋ค. ์ด ํด๋์ค๋ ๋ง์ถคํ ์ธ์
๋ฐฑ์๋๋ฅผ ๋ํ๋
๋๋ค.
3. ์ธ์ ์คํ ์ด ํด๋์ค ์ ์
๋ํ `django.contrib.sessions.backends.base.SessionStore`๋ฅผ ์์ํ๋ ์ธ์ ์คํ ์ด ํด๋์ค๋ฅผ ์์ฑํด์ผ ํฉ๋๋ค. ์ด ํด๋์ค๋ ์ธ์ ๋ฐ์ดํฐ์ ์ค์ ์ฝ๊ธฐ, ์ฐ๊ธฐ ๋ฐ ์ญ์ ๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค.
```python from django.contrib.sessions.backends.base import SessionStore from django.core.exceptions import SuspiciousOperation class MySessionStore(SessionStore): """ ์ฌ์ฉ์ ์ ์ ์ธ์ ์คํ ์ด ๊ตฌํ. """ def load(self): try: # ์คํ ๋ฆฌ์ง (์: ๋ฐ์ดํฐ๋ฒ ์ด์ค, ์บ์)์์ ์ธ์ ๋ฐ์ดํฐ ๋ก๋ session_data = self._load_data_from_storage() return self.decode(session_data) except: return {} def exists(self, session_key): # ์คํ ๋ฆฌ์ง์ ์ธ์ ์ด ์กด์ฌํ๋์ง ํ์ธ return self._check_session_exists(session_key) def create(self): while True: self._session_key = self._get_new_session_key() try: # ์ ์ธ์ ์ ์ฅ ์๋ self.save(must_create=True) break except SuspiciousOperation: # ํค ์ถฉ๋, ๋ค์ ์๋ continue def save(self, must_create=False): # ์ธ์ ๋ฐ์ดํฐ๋ฅผ ์คํ ๋ฆฌ์ง์ ์ ์ฅ session_data = self.encode(self._get_session(no_load=self._session_cache is None)) if must_create: self._create_session_in_storage(self.session_key, session_data, self.get_expiry_age()) else: self._update_session_in_storage(self.session_key, session_data, self.get_expiry_age()) def delete(self, session_key=None): if session_key is None: if self.session_key is None: return session_key = self.session_key # ์คํ ๋ฆฌ์ง์์ ์ธ์ ์ญ์ self._delete_session_from_storage(session_key) def _load_data_from_storage(self): # ์คํ ๋ฆฌ์ง์์ ์ธ์ ๋ฐ์ดํฐ๋ฅผ ๊ฒ์ํ๋ ๋ก์ง์ ๊ตฌํํ์ธ์ raise NotImplementedError("์๋ธํด๋์ค๋ ์ด ๋ฉ์๋๋ฅผ ๊ตฌํํด์ผ ํฉ๋๋ค.") def _check_session_exists(self, session_key): # ์คํ ๋ฆฌ์ง์ ์ธ์ ์ด ์กด์ฌํ๋์ง ํ์ธํ๋ ๋ก์ง์ ๊ตฌํํ์ธ์ raise NotImplementedError("์๋ธํด๋์ค๋ ์ด ๋ฉ์๋๋ฅผ ๊ตฌํํด์ผ ํฉ๋๋ค.") def _create_session_in_storage(self, session_key, session_data, expiry_age): # ์คํ ๋ฆฌ์ง์ ์ธ์ ์ ์์ฑํ๋ ๋ก์ง์ ๊ตฌํํ์ธ์ raise NotImplementedError("์๋ธํด๋์ค๋ ์ด ๋ฉ์๋๋ฅผ ๊ตฌํํด์ผ ํฉ๋๋ค.") def _update_session_in_storage(self, session_key, session_data, expiry_age): # ์คํ ๋ฆฌ์ง์์ ์ธ์ ์ ์ ๋ฐ์ดํธํ๋ ๋ก์ง์ ๊ตฌํํ์ธ์ raise NotImplementedError("์๋ธํด๋์ค๋ ์ด ๋ฉ์๋๋ฅผ ๊ตฌํํด์ผ ํฉ๋๋ค.") def _delete_session_from_storage(self, session_key): # ์คํ ๋ฆฌ์ง์์ ์ธ์ ์ ์ญ์ ํ๋ ๋ก์ง์ ๊ตฌํํ์ธ์ raise NotImplementedError("์๋ธํด๋์ค๋ ์ด ๋ฉ์๋๋ฅผ ๊ตฌํํด์ผ ํฉ๋๋ค.") ```4. ํ์ ๋ฉ์๋ ๊ตฌํ
MySessionStore
ํด๋์ค์์ ๋ค์ ๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ํฉ๋๋ค:
load()
: ์คํ ๋ฆฌ์ง ์์คํ ์์ ์ธ์ ๋ฐ์ดํฐ๋ฅผ ๋ก๋ํ๊ณ (self.decode()
๋ฅผ ์ฌ์ฉํ์ฌ) ๋์ฝ๋ฉํ ๋ค์ ๋์ ๋๋ฆฌ๋ก ๋ฐํํฉ๋๋ค. ์ธ์ ์ด ์กด์ฌํ์ง ์์ผ๋ฉด ๋น ๋์ ๋๋ฆฌ๋ฅผ ๋ฐํํฉ๋๋ค.exists(session_key)
: ์ฃผ์ด์ง ํค๋ฅผ ๊ฐ์ง ์ธ์ ์ด ์คํ ๋ฆฌ์ง ์์คํ ์ ์กด์ฌํ๋์ง ํ์ธํฉ๋๋ค. ์ธ์ ์ด ์กด์ฌํ๋ฉดTrue
๋ฅผ, ๊ทธ๋ ์ง ์์ผ๋ฉดFalse
๋ฅผ ๋ฐํํฉ๋๋ค.create()
: ์๋กญ๊ณ ๋น ์ธ์ ์ ์์ฑํฉ๋๋ค. ์ด ๋ฉ์๋๋ ๊ณ ์ ํ ์ธ์ ํค๋ฅผ ์์ฑํ๊ณ ๋น ์ธ์ ์ ์คํ ๋ฆฌ์ง์ ์ ์ฅํด์ผ ํฉ๋๋ค. ์ค๋ฅ๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ์ ์ฌ์ ์ธ ํค ์ถฉ๋์ ์ฒ๋ฆฌํ์ธ์.save(must_create=False)
: ์ธ์ ๋ฐ์ดํฐ๋ฅผ ์คํ ๋ฆฌ์ง ์์คํ ์ ์ ์ฅํฉ๋๋ค.must_create
์ธ์๋ ์ธ์ ์ด ์ฒ์ ์์ฑ๋๋์ง ์ฌ๋ถ๋ฅผ ๋ํ๋ ๋๋ค.must_create
๊ฐTrue
์ธ ๊ฒฝ์ฐ, ๋์ผํ ํค๋ฅผ ๊ฐ์ง ์ธ์ ์ด ์ด๋ฏธ ์กด์ฌํ๋ฉด ๋ฉ์๋๋SuspiciousOperation
์์ธ๋ฅผ ๋ฐ์์์ผ์ผ ํฉ๋๋ค. ์ด๋ ์ธ์ ์์ฑ ์ค ๊ฒฝ์ ์ํ๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํจ์ ๋๋ค. ์ ์ฅํ๊ธฐ ์ ์self.encode()
๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ธ์ฝ๋ฉํฉ๋๋ค.delete(session_key=None)
: ์คํ ๋ฆฌ์ง ์์คํ ์์ ์ธ์ ๋ฐ์ดํฐ๋ฅผ ์ญ์ ํฉ๋๋ค.session_key
๊ฐNone
์ด๋ฉด ํ์ฌsession_key
์ ๊ด๋ จ๋ ์ธ์ ์ ์ญ์ ํฉ๋๋ค._load_data_from_storage()
: ์ถ์ ๋ฉ์๋. ์คํ ๋ฆฌ์ง์์ ์ธ์ ๋ฐ์ดํฐ๋ฅผ ๊ฒ์ํ๋ ๋ก์ง์ ๊ตฌํํฉ๋๋ค._check_session_exists(session_key)
: ์ถ์ ๋ฉ์๋. ์คํ ๋ฆฌ์ง์ ์ธ์ ์ด ์กด์ฌํ๋์ง ํ์ธํ๋ ๋ก์ง์ ๊ตฌํํฉ๋๋ค._create_session_in_storage(session_key, session_data, expiry_age)
: ์ถ์ ๋ฉ์๋. ์คํ ๋ฆฌ์ง์ ์ธ์ ์ ์์ฑํ๋ ๋ก์ง์ ๊ตฌํํฉ๋๋ค._update_session_in_storage(session_key, session_data, expiry_age)
: ์ถ์ ๋ฉ์๋. ์คํ ๋ฆฌ์ง์์ ์ธ์ ์ ์ ๋ฐ์ดํธํ๋ ๋ก์ง์ ๊ตฌํํฉ๋๋ค._delete_session_from_storage(session_key)
: ์ถ์ ๋ฉ์๋. ์คํ ๋ฆฌ์ง์์ ์ธ์ ์ ์ญ์ ํ๋ ๋ก์ง์ ๊ตฌํํฉ๋๋ค.
์ค์ ๊ณ ๋ ค์ฌํญ:
- ์ค๋ฅ ์ฒ๋ฆฌ: ์คํ ๋ฆฌ์ง ์ค๋ฅ๋ฅผ ์ ์์ ์ผ๋ก ์ฒ๋ฆฌํ๊ณ ๋ฐ์ดํฐ ์์ค์ ๋ฐฉ์งํ๊ธฐ ์ํด ๊ฐ๋ ฅํ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ๊ตฌํํฉ๋๋ค.
- ๋์์ฑ: ์คํ ๋ฆฌ์ง ์์คํ ์ด ์ฌ๋ฌ ์ค๋ ๋ ๋๋ ํ๋ก์ธ์ค์ ์ํด ์ก์ธ์ค๋๋ ๊ฒฝ์ฐ ๋์์ฑ ๋ฌธ์ ๋ฅผ ๊ณ ๋ คํฉ๋๋ค. ๋ฐ์ดํฐ ์์์ ๋ฐฉ์งํ๊ธฐ ์ํด ์ ์ ํ ์ ๊ธ ๋ฉ์ปค๋์ฆ์ ์ฌ์ฉํฉ๋๋ค.
- ์ธ์
๋ง๋ฃ: ๋ง๋ฃ๋ ์ธ์
์ ์คํ ๋ฆฌ์ง ์์คํ
์์ ์๋์ผ๋ก ์ ๊ฑฐํ๋๋ก ์ธ์
๋ง๋ฃ๋ฅผ ๊ตฌํํฉ๋๋ค. Django๋ ์ธ์
๋ง๋ฃ ์๊ฐ์ ๊ฒฐ์ ํ๊ธฐ ์ํด
get_expiry_age()
๋ฉ์๋๋ฅผ ์ ๊ณตํฉ๋๋ค.
5. ๋ง์ถคํ ๋ฐฑ์๋๋ฅผ ์ฌ์ฉํ๋๋ก Django ๊ตฌ์ฑ
๋ง์ถคํ ์ธ์
๋ฐฑ์๋๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด settings.py
ํ์ผ์์ SESSION_ENGINE
์ค์ ์ ์
๋ฐ์ดํธํฉ๋๋ค:
your_app
์ Django ์ฑ์ ์ด๋ฆ์ผ๋ก ๋ฐ๊พธ๊ณ my_session_backend
๋ฅผ ์ธ์
๋ฐฑ์๋ ๋ชจ๋์ ์ด๋ฆ์ผ๋ก ๋ฐ๊ฟ๋๋ค.
์์: Redis๋ฅผ ์ธ์ ๋ฐฑ์๋๋ก ์ฌ์ฉํ๊ธฐ
Redis๋ฅผ ๋ง์ถคํ ์ธ์
๋ฐฑ์๋๋ก ์ฌ์ฉํ๋ ๊ตฌ์ฒด์ ์ธ ์์๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค. ๋จผ์ redis
Python ํจํค์ง๋ฅผ ์ค์นํฉ๋๋ค:
์ด์ my_session_backend.py
ํ์ผ์ ์์ ํ์ฌ Redis๋ฅผ ์ฌ์ฉํ๋๋ก ํฉ๋๋ค:
settings.py
์์ ์ค์ ์ ๊ตฌ์ฑํ๋ ๊ฒ์ ์์ง ๋ง์ธ์.
your_app
์ ๋ฐ๊พธ๊ณ Redis ์ฐ๊ฒฐ ๋งค๊ฐ๋ณ์๋ฅผ ๊ทธ์ ๋ฐ๋ผ ์
๋ฐ์ดํธํฉ๋๋ค.
๋ณด์ ๊ณ ๋ ค์ฌํญ
๋ง์ถคํ ์ธ์ ๋ฐฑ์๋๋ฅผ ๊ตฌํํ ๋ ๋ณด์์ ์ต์ฐ์ ์์์ฌ์ผ ํฉ๋๋ค. ๋ค์ ์ฌํญ์ ๊ณ ๋ คํ์ธ์:
- ์ธ์ ํ์ด์ฌํน: HTTPS๋ฅผ ์ฌ์ฉํ์ฌ ์ธ์ ์ฟ ํค๋ฅผ ์ํธํํ๊ณ ๊ต์ฐจ ์ฌ์ดํธ ์คํฌ๋ฆฝํ (XSS) ์ทจ์ฝ์ ์ ๋ฐฉ์งํ์ฌ ์ธ์ ํ์ด์ฌํน์ผ๋ก๋ถํฐ ๋ณดํธํฉ๋๋ค.
- ์ธ์ ๊ณ ์ : ์ฌ์ฉ์๊ฐ ๋ก๊ทธ์ธํ ํ ์ธ์ ID๋ฅผ ์ฌ์์ฑํ๋ ๊ฒ๊ณผ ๊ฐ์ด ์ธ์ ๊ณ ์ ๊ณต๊ฒฉ์ ๋ฐฉ์งํ๊ธฐ ์ํ ์กฐ์น๋ฅผ ๊ตฌํํฉ๋๋ค.
- ๋ฐ์ดํฐ ์ํธํ: ๋ฏผ๊ฐํ ์ธ์ ๋ฐ์ดํฐ๋ฅผ ๋ฌด๋จ ์ก์ธ์ค๋ก๋ถํฐ ๋ณดํธํ๊ธฐ ์ํด ์ํธํํฉ๋๋ค.
- ์ ๋ ฅ ์ ํจ์ฑ ๊ฒ์ฌ: ์ธ์ ๋ฐ์ดํฐ๋ฅผ ์์์ํฌ ์ ์๋ ์ฃผ์ ๊ณต๊ฒฉ์ ๋ฐฉ์งํ๊ธฐ ์ํด ๋ชจ๋ ์ฌ์ฉ์ ์ ๋ ฅ์ ์ ํจ์ฑ ๊ฒ์ฌํฉ๋๋ค.
- ์คํ ๋ฆฌ์ง ๋ณด์: ๋ฌด๋จ ์ก์ธ์ค๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ์ธ์ ์คํ ๋ฆฌ์ง ์์คํ ์ ๋ณดํธํฉ๋๋ค. ์ฌ๊ธฐ์๋ ์ ๊ทผ ์ ์ด ๋ชฉ๋ก, ๋ฐฉํ๋ฒฝ ๋ฐ ์นจ์ ํ์ง ์์คํ ๊ตฌ์ฑ์ด ํฌํจ๋ ์ ์์ต๋๋ค.
์ค์ ์ฌ์ฉ ์ฌ๋ก
๋ง์ถคํ ์ธ์ ๋ฐฑ์๋๋ ๋ค์ํ ์๋๋ฆฌ์ค์์ ์ ์ฉํฉ๋๋ค:
- ์ ์์๊ฑฐ๋ ํ๋ซํผ: ์๋ฐฑ๋ง ์ฌ์ฉ์์ ๋๊ท๋ชจ ์ฅ๋ฐ๊ตฌ๋ ๋ฐ ์ฌ์ฉ์ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํด Cassandra์ ๊ฐ์ ๊ณ ์ฑ๋ฅ NoSQL ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฌ์ฉํ๋ ๋ง์ถคํ ๋ฐฑ์๋๋ฅผ ๊ตฌํํฉ๋๋ค.
- ์์ ๋ฏธ๋์ด ์ ํ๋ฆฌ์ผ์ด์ : ์ง๋ฆฌ์ ์ผ๋ก ๋ถ์ฐ๋ ์ง์ญ์ ์ฌ์ฉ์์๊ฒ ๋ฎ์ ์ง์ฐ ์๊ฐ์ ๋ณด์ฅํ๊ธฐ ์ํด ๋ถ์ฐ ์บ์์ ์ธ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํฉ๋๋ค.
- ๊ธ์ต ์ ํ๋ฆฌ์ผ์ด์ : ๋ฏผ๊ฐํ ๊ธ์ต ๋ฐ์ดํฐ๋ฅผ ๋ณดํธํ๊ธฐ ์ํด ๊ฐ๋ ฅํ ์ํธํ ๋ฐ ๋ค๋จ๊ณ ์ธ์ฆ์ ์ฌ์ฉํ๋ ๋ง์ถคํ ๋ฐฑ์๋๋ฅผ ๊ตฌํํฉ๋๋ค. ํค ๊ด๋ฆฌ๋ฅผ ์ํด HSM(ํ๋์จ์ด ๋ณด์ ๋ชจ๋)์ ๊ณ ๋ คํ์ธ์.
- ๊ฒ์ ํ๋ซํผ: ํ๋ ์ด์ด ์งํ ์ํฉ ๋ฐ ๊ฒ์ ์ํ๋ฅผ ์ ์ฅํ๊ธฐ ์ํด ๋ง์ถคํ ๋ฐฑ์๋๋ฅผ ์ฌ์ฉํ์ฌ ์ค์๊ฐ ์ ๋ฐ์ดํธ์ ์ํํ ๊ฒ์ ๊ฒฝํ์ ์ ๊ณตํฉ๋๋ค.
๊ฒฐ๋ก
Django์์ ๋ง์ถคํ ์ธ์ ๋ฐฑ์๋๋ฅผ ์ ์ํ๋ ๊ฒ์ ์ธ์ ๊ด๋ฆฌ์ ๋ํ ์์ฒญ๋ ์ ์ฐ์ฑ๊ณผ ์ ์ด ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค. ๊ธฐ๋ณธ ์๋ฆฌ๋ฅผ ์ดํดํ๊ณ ์ฑ๋ฅ, ํ์ฅ์ฑ ๋ฐ ๋ณด์ ์๊ตฌ์ฌํญ์ ์ ์คํ๊ฒ ๊ณ ๋ คํจ์ผ๋ก์จ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ณ ์ ํ ์๊ตฌ์ฌํญ์ ๋ง์ถฐ ๊ณ ๋๋ก ์ต์ ํ๋๊ณ ๊ฒฌ๊ณ ํ ์ธ์ ์คํ ๋ฆฌ์ง ์๋ฃจ์ ์ ๊ตฌ์ถํ ์ ์์ต๋๋ค. ์ด๋ฌํ ์ ๊ทผ ๋ฐฉ์์ ๊ธฐ๋ณธ ์ต์ ์ด ๋ถ์ถฉ๋ถํด์ง๋ ๋๊ท๋ชจ ์ ํ๋ฆฌ์ผ์ด์ ์ ํนํ ์ค์ํฉ๋๋ค. ์ฌ์ฉ์ ๋ฐ์ดํฐ๋ฅผ ๋ณดํธํ๊ณ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฌด๊ฒฐ์ฑ์ ์ ์งํ๊ธฐ ์ํด ๋ง์ถคํ ์ธ์ ๋ฐฑ์๋๋ฅผ ๊ตฌํํ ๋๋ ํญ์ ๋ณด์ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ์ฐ์ ์ํ๋ ๊ฒ์ ๊ธฐ์ตํ์ธ์.